﻿using Autofac;
using MVC高级教程.Service.Impl;

namespace MVC高级教程.Service
{

    /// <summary>
    /// Module 反射模块，每个反射模块中有不同的反射内容
    /// 开发时服务有很多可能几百个
    /// 可以有多个反射模块，用于给这些服务进行分类
    /// </summary>
    public class AotofacModuleRegister:Module  //一定要继承  Module:对模块执行反射的类型
    {
        //重写Load方法
        //可以在此方法内进行批量注入
        protected override void Load(ContainerBuilder builder)
        {
            //注册公开接口
            //Autofac 服务的声明周期
            // builder.RegisterType<FoodService>().As<IFoodService >().InstancePerDependency();//默认声明周期为瞬时
            // builder.RegisterType<FoodService>().As<IFoodService >().InstancePerLifetimeScope();//Scope与Autofac的ServiceProvider同寿命
            // builder.RegisterType<FoodService>().As<IFoodService >().InstancePerDependency();//Singleton 

            //从程序集批量注册

            builder.RegisterAssemblyTypes(typeof(FoodService).Assembly)
            .Where(p => p.Name.EndsWith("Service"))//程序集中类型名有“Service”的类和接口，根据名称规则 eg：IFoodService 与 FoodService,都参与匹配
            .AsImplementedInterfaces();
        }
    }


    //Autofac除了能注册服务注入服务外，最大的优点是它可以写拦截器，这是.netDI做不到的，面向切面
}
